#include <bits/stdc++.h>
using namespace std;

/*
118. 杨辉三角
已解答
简单
相关标签
premium lock icon
相关企业
给定一个非负整数 numRows，生成「杨辉三角」的前 numRows 行。

在「杨辉三角」中，每个数是它左上方和右上方的数的和。



 

示例 1:

输入: numRows = 5
输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]
示例 2:

输入: numRows = 1
输出: [[1]]
 

提示:

1 <= numRows <= 30
*/

// 法一
class Solution {
public:
    vector<vector<int>> generate(int numRows) {
        vector<vector<int>> triangle; // 存储杨辉三角
        if (numRows == 0) {
            return triangle; // 如果行数为0，返回空的杨辉三角
        }

        // 初始化第一个元素，即第一行
        triangle.push_back({1});

        for (int i = 1; i < numRows; ++i) {
            vector<int> row(i + 1, 1); // 每一行的元素数是行号+1
            // 计算当前行中间的元素
            for (int j = 1; j < i; ++j) {
                row[j] = triangle[i - 1][j - 1] + triangle[i - 1][j];
            }
            triangle.push_back(row); // 将当前行加入杨辉三角
        }
        return triangle;
    }
};

// 早先
class Solution {
public:
    vector<vector<int>> generate(int numRows) {
        vector<vector<int>> triangle; // 存储杨辉三角
        if (numRows == 0) {
            return triangle; // 如果行数为0，返回空的杨辉三角
        }

        // 初始化第一个元素，即第一行
        triangle.push_back({1});

        for (int i = 1; i < numRows; ++i) {
            vector<int> row(i + 1, 1); // 每一行的元素数是行号+1
            // 计算当前行中间的元素
            for (int j = 1; j < i; ++j) {
                row[j] = triangle[i - 1][j - 1] + triangle[i - 1][j];
            }
            triangle.push_back(row); // 将当前行加入杨辉三角
        }
        return triangle;
    }
};